package oop.controller.action.question;

import oop.controller.action.DefaultAction;
import oop.controller.change.question.QuestionContentChange;
import oop.data.BaseQuestion;
import oop.data.Topic;
import oop.db.dao.QuestionDAO;
import oop.db.dao.TextDAO;
import oop.db.dao.TopicDAO;

import org.apache.commons.lang.StringUtils;

import com.oreilly.servlet.ParameterNotFoundException;

public class EditAction extends DefaultAction {
	
	@Override
	public void performImpl() throws Exception {
		long id = Long.parseLong(request.getParameter("qe_id"));
		question = QuestionDAO.fetchByIdBase(id);

		if (question == null) {
			request.setAttribute("message", "Không tìm thấy câu hỏi");
			setNextAction("error");
			return;
		}

		title("Thay đổi nội dung câu hỏi " + question.getId());
		
		String submit = request.getParameter("qe_submit");
		if (!StringUtils.isEmpty(submit)) {
			doEdit();
		}
	}
	
	private void doEdit() throws Exception {
		boolean error = false;

		long topicId = 0;
		try {
			topicId = getParams().getLong("qe_topic");
			Topic topic = TopicDAO.fetchById(topicId);
			if (topic == null) {
				topicError = "Chủ đề không tồn tại.";
				error = true;
			} else {
				question.setTopic(topic);
			}
		} catch (ParameterNotFoundException ex) {
			request.setAttribute("topicErr", "Bạn cần chọn chủ đề.");
			error = true;
		} catch (NumberFormatException ex) {
			request.setAttribute("topicErr", "ID không hợp lệ: " + request.getParameter("qe_topic"));
			error = true;
		}

		int level = 3;
		try {
			level = getParams().getInt("qe_level");
			if (level < 1 || level > 5) {
				levelError = "Độ khó không hợp lệ.";
				error = true;
			} else {
				question.setLevel(level);
			}
		} catch (NumberFormatException ex) {
			levelError = "Độ khó không hợp lệ.";
			error = true;
		} catch (ParameterNotFoundException e) {
			levelError = "Bạn cần chọn độ khó.";
			error = true;
		}
				
		if (!error) {
			QuestionDAO.persist(question);
			setNextAction("question.view&qv_id=" + question.getId());
		}

		String content = request.getParameter("qe_content");
		if (!question.getContent().equals(content)) {
			change(new QuestionContentChange(question.getId(), TextDAO.create(
					content).getId()), question, "", false);
		}
	}

	private String levelError;
	private String markError;
	private String topicError;
	private String contentError;
	private BaseQuestion question;
	
	public String getLevelError() {
		return levelError;
	}
	public String getMarkError() {
		return markError;
	}
	public String getTopicError() {
		return topicError;
	}
	
	public String getContentError() {
		return contentError;
	}
	
	public BaseQuestion getQuestion() {
		return question;
	}

}
